// LogConfig.cpp
// 统一日志配置管理器实现

#include "LogConfig.hh"
#include <cstdlib>
#include <cstring>
#include <algorithm>

// 获取单例实例
LogConfig& LogConfig::getInstance() {
    static LogConfig instance;
    return instance;
}

// 构造函数
LogConfig::LogConfig()
    : fGlobalLevel(1)  // 默认INFO级别
    , fLogFile("log.txt")
    , fErrorLogFile("err.txt")
    , fPerformanceLogFile("pro.txt")
    , fShowTimestamp(true)
    , fShowThreadId(true)
    , fShowFileName(true)
    , fShowFunctionName(true)
    , fShowLineNumber(true)
    , fLoggingEnabled(true) {
    // 默认所有模块都启用
    for (int i = 0; i < (int)LogModule::COUNT; i++) {
        fModuleEnabled[i] = true;
    }
    
    // 从环境变量加载配置
    loadFromEnvironment();
}

// 析构函数
LogConfig::~LogConfig() {
}

// 初始化配置
void LogConfig::init() {
    // 默认已初始化，可以在这里添加额外的初始化逻辑
}

// 设置全局日志级别
void LogConfig::setGlobalLevel(int level) {
    if (level >= 0 && level <= 4) {
        fGlobalLevel = level;
    }
}

// 设置模块日志开关
void LogConfig::setModuleEnabled(LogModule module, bool enabled) {
    if (module == LogModule::ALL) {
        for (int i = 0; i < (int)LogModule::COUNT; i++) {
            fModuleEnabled[i] = enabled;
        }
    } else if (module >= LogModule::MAIN && module < LogModule::COUNT) {
        fModuleEnabled[(int)module] = enabled;
    }
}

// 检查模块是否启用
bool LogConfig::isModuleEnabled(LogModule module) const {
    if (module == LogModule::ALL) {
        return fLoggingEnabled;
    }
    if (module >= LogModule::MAIN && module < LogModule::COUNT) {
        return fLoggingEnabled && fModuleEnabled[(int)module];
    }
    return false;
}

// 设置日志输出文件
void LogConfig::setLogFile(const std::string& filename) {
    fLogFile = filename;
}

void LogConfig::setErrorLogFile(const std::string& filename) {
    fErrorLogFile = filename;
}

void LogConfig::setPerformanceLogFile(const std::string& filename) {
    fPerformanceLogFile = filename;
}

// 从环境变量加载配置
void LogConfig::loadFromEnvironment() {
    // 检查日志级别环境变量
    const char* logLevel = getenv("LOG_LEVEL");
    if (logLevel) {
        int level = atoi(logLevel);
        setGlobalLevel(level);
    }
    
    // 检查日志总开关
    const char* logEnabled = getenv("LOG_ENABLED");
    if (logEnabled) {
        fLoggingEnabled = (strcmp(logEnabled, "1") == 0 || 
                          strcasecmp(logEnabled, "true") == 0 ||
                          strcasecmp(logEnabled, "yes") == 0);
    }
    
    // 检查日志文件路径
    const char* logFile = getenv("LOG_FILE");
    if (logFile) {
        fLogFile = logFile;
    }
    
    const char* errorLogFile = getenv("ERROR_LOG_FILE");
    if (errorLogFile) {
        fErrorLogFile = errorLogFile;
    }
    
    const char* perfLogFile = getenv("PERF_LOG_FILE");
    if (perfLogFile) {
        fPerformanceLogFile = perfLogFile;
    }
    
    // 检查模块开关（格式：LOG_MODULE_<MODULE>=0/1）
    for (int i = (int)LogModule::MAIN; i < (int)LogModule::COUNT; i++) {
        std::string envName = "LOG_MODULE_";
        envName += getModuleName((LogModule)i);
        std::transform(envName.begin(), envName.end(), envName.begin(), ::toupper);
        
        const char* moduleEnabled = getenv(envName.c_str());
        if (moduleEnabled) {
            fModuleEnabled[i] = (strcmp(moduleEnabled, "1") == 0 || 
                                strcasecmp(moduleEnabled, "true") == 0 ||
                                strcasecmp(moduleEnabled, "yes") == 0);
        }
    }
}

// 获取模块名称字符串
const char* LogConfig::getModuleName(LogModule module) {
    switch (module) {
        case LogModule::ALL: return "ALL";
        case LogModule::MAIN: return "MAIN";
        case LogModule::ENCODE: return "ENCODE";
        case LogModule::BUFFER: return "BUFFER";
        case LogModule::STREAM: return "STREAM";
        case LogModule::SERVICE: return "SERVICE";
        case LogModule::RINGFIFO: return "RINGFIFO";
        case LogModule::RTSP: return "RTSP";
        case LogModule::VIDEO: return "VIDEO";
        case LogModule::PERFORMANCE: return "PERFORMANCE";
        default: return "UNKNOWN";
    }
}

